﻿
//#include<iostream>
//#include<memory>
//
//
////业务场景：在线支付流程中创建订单后，再扣减库存时抛异常，导致订单对象（裸指针）未被 delete，造成内存泄漏
//
//// 仅示例：可能抛异常的服务
//struct InventoryService {
//    static void deduct(const std::string& sku) {
//        if (sku == "sku_bad") throw std::runtime_error("库存不足");
//    }
//};
//struct PaymentService {
//    static void charge(const std::string& id) {
//        // 模拟第三方支付异常
//        if (id == "bad_pay") throw std::runtime_error("支付失败");
//    }
//};
//
//
//
//class Order {
//public:
//    explicit Order(std::string id) : id_(std::move(id)) {
//        std::cout << "[Order " << id_ << "] created\n";
//    }
//    ~Order() { std::cout << "[Order " << id_ << "] destroyed\n"; }
//
//    const std::string& id() const noexcept { return id_; }
//    std::string sku() const { return "sku_" + id_; }
//
//private:
//    std::string id_;
//};
//
//
//class OrderManager {
//public:
//    // 创建订单并立即交给智能指针托管
//    [[nodiscard]] static std::shared_ptr<Order>
//        create(const std::string& id) {
//        return std::make_shared<Order>(id);
//    }
//
//    // 业务链：扣库存 → 扣款
//    static void process(const std::shared_ptr<Order>& order) 
//    {
//        // 任何一步抛异常，shared_ptr 离开作用域即自动释放
//        InventoryService::deduct(order->sku());
//        PaymentService::charge(order->id());
//    }
//};
//
//
//
//int main() 
//{
//Order* raw = new Order("leak");   // 裸指针
//try {
//    InventoryService::deduct(raw->sku()); // 可能抛异常
//    PaymentService::charge(raw->id());
//    delete raw;                     // 异常路径不会走到这里
//}
//catch (...) {
//    // 没有 delete raw; → 泄漏
//}
//return 0;
//}


////直接 `new` 会暴露裸指针，如果抛异常就泄漏：
//#include <iostream>
//#include <stdexcept>
//
//struct Data {
//    Data() { std::cout << "Data 构造\n"; }
//    ~Data() { std::cout << "Data 析构\n"; }
//};
//
//int main()
//{
//    try 
//    {
//        Data* p = new Data();   // 1. 裸指针
//        throw std::runtime_error("人为异常"); // 2. 提前抛异常
//        delete p;               // 3. ❗永远不会执行
//    }
//    catch (const std::exception& e) {
//        std::cout << "捕获异常：" << e.what() << "\n";
//    }
//    std::cout << "main 结束，Data 对象泄漏！\n";
//    return 0;
//}

//make_shared版（无泄漏）


#include <iostream>
#include <memory>
#include <stdexcept>

struct Data 
{
    Data() { std::cout << "Data 构造\n"; }
    ~Data() { std::cout << "Data 析构\n"; }
};

int main() {
    try {
        //最后一个 shared_ptr 离开作用域，引用计数归零时，对象才被析构，内存被释放
        auto p = std::make_shared<Data>(); // RAII 托管
        throw std::runtime_error("人为异常");
    }
    catch (const std::exception& e) {
        std::cout << "捕获异常：" << e.what() << "\n";
    }
    std::cout << "main 结束，Data 已自动回收！\n";
    return 0;
}